package com.nd.qa.shareplate.thread;

import java.util.LinkedList;
/**
 * ① wait()：可以使调用该方法的线程释放共享资源的锁，然后从运行状态退出，进入等待队列，直到被再次唤醒。
 * ② notify()：可以唤醒等待队列中第一个等待同一共享资源的线程，并使该线程退出等待队列，进入可运行状态。
 * ③ notifyAll()：可以使所有正在等待队列中同一共享资源的线程从等待队列状态退出，进入可运行状态，此时，优先级最高的那个线程最先执行。 
 * @author Administrator
 *
 */
public class Basket {

	LinkedList<Apple> basket = new LinkedList<Apple>();
	
	public synchronized void popApple(){
		for (int i = 0; i < 20; i++) {
			pop();
		}
	}
	
	public synchronized void pushApple(){
		for (int i = 0; i < 20; i++) {
			Apple apple = new Apple(i);
			push(apple);
		}
	}
	
	// 向篮子中放苹果
	 private void push(Apple apple) {
	     // 当篮子中存放了5个苹果就等待并通知消费者来消费
	     if (basket.size() == 5) {
	         try {
	             wait();
	         } catch (InterruptedException e) {
	             e.printStackTrace();
	         }// 等待并释放当前资源的锁
	     }
	     try {
	         Thread.sleep(500);
	     } catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	     basket.addFirst(apple);
	     System.out.println("存放：" + apple.toString());
	     notify();// 通知消费者来消费
	 }
	 // 向篮子中取苹果
	 private void pop() {
	     // 当篮子中苹果为0时就等待并通知生产者来生产
	     if (basket.size() == 0) {
	         try {
	             wait();
	         } catch (InterruptedException e) {
	             e.printStackTrace();
	         }// 等待并释放当前资源的锁
	     }
	     try {
	         Thread.sleep(500);
	     } catch (InterruptedException e) {
	         e.printStackTrace();
	     }
	     Apple apple = basket.removeFirst();
	     System.out.println("吃掉：" + apple.toString());
	     notify();// 通知生产者来生产
	  }
}
